package middleware

import (
    "fmt"
    "net/http"
    "runtime"
    "strconv"
    "strings"
    "time"

    "github.com/gin-gonic/gin"
)

func CustomError(c *gin.Context) {
    defer func() {
        if err := recover(); err != nil {

            if c.IsAborted() {
                c.Status(200)
            }
            switch errStr := err.(type) {
            case string:
                p := strings.Split(errStr, "#")
                if len(p) == 3 && p[0] == "CustomError" {
                    statusCode, e := strconv.Atoi(p[1])
                    if e != nil {
                        break
                    }
                    c.Status(statusCode)
                    fmt.Println(
                        time.Now().Format("2006-01-02 15:04:05"),
                        "[ERROR]",
                        c.Request.Method,
                        c.Request.URL,
                        statusCode,
                        c.Request.RequestURI,
                        c.ClientIP(),
                        p[2],
                    )
                    c.JSON(http.StatusOK, gin.H{
                        "code": statusCode,
                        "msg":  p[2],
                    })
                } else {
                    fmt.Println(
                        time.Now().Format("2006-01-02 15:04:05"),
                        "[ERROR]",
                        c.Request.Method,
                        c.Request.URL,
                        500,
                        c.Request.RequestURI,
                        c.ClientIP(),
                        p[2],
                    )
                    c.JSON(http.StatusOK, gin.H{
                        "code": 500,
                        "msg":  errStr,
                    })
                }
            case runtime.Error:
                c.JSON(http.StatusOK, gin.H{
                    "code": 500,
                    "msg":  errStr.Error(),
                })
            default:
                panic(err)
            }
        }
    }()
    c.Next()
}
